<?php


namespace app\Utils;

use Swoole\Process;

/**
 * 子进程工具类
 * Class ProcessUtil
 * @package app\Utils
 */
class ProcessUtil
{
    public static $workers = [];
    public static $task_list = [];

    /**
     * 创建子进程
     * $task  is_remote : 1-本地 2-远程
     *        shell_content : 要执行的脚本内容
     * @param null $task
     */
    public static function create_process($task = NULL)
    {

        if(empty($task))
        {
            LogUtil::log('警告：进程任务不能为空');
        }else{

            $process = new Process(function (Process $childProcess) use ($task){

                //具体的远程执行或者本地脚本命令
                LogUtil::log("进入回调方法");
                $childProcess->exec('/usr/local/data/php/bin/php', array(__DIR__.'/../test/swoole_process_test.php'));

            });
            $pid = $process->start();
            // 进程重命名
            $process->name('crontab_' . $pid);
            // 将每一个进程的句柄存起来
            self::$workers[$pid] = $process;
        }
    }

    /**
     * 子进程异步监听信号
     */
    public static function signal()
    {
        Process::signal(SIGCHLD, function ($sig) {
            //必须为false，非阻塞模式
            while ($ret = Process::wait(false)) {

                LogUtil::log("PID={$ret['pid']}进程任务完毕");
            }
        });
    }

}